/** 
* Copyright (C) 2012-2018 ZEEI Inc.All Rights Reserved.
* 项目名称：pls
* 文件名称：LicenceGisServiceImpl.java
* 包  名  称：com.zeei.gis.service.imp
* 文件描述：TODO 请修改文件描述
* 创建日期：2018年1月8日上午11:39:31
* 
* 修改历史
* 1.0 jiangqingpeng 2018年1月8日上午11:39:31 创建文件
*
*/

package com.zeei.gis.service.imp;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.zeei.gis.dao.LicenceGisVODao;
import com.zeei.gis.service.LicenceGisService;
import com.zeei.gis.vo.AreaCodeGisVO;
import com.zeei.gis.vo.ExpireLicenceGisVO;
import com.zeei.gis.vo.LicenceReturnDataGisVO;

/**
 * @类型名称：LicenceGisServiceImpl
 * @类描述：TODO 到期许可证检索
 * @功能描述：TODO 到期许可证检索
 * @创建作者：jiangqingpeng
 */
@Service("licenceGisService")
public class LicenceGisServiceImpl implements LicenceGisService{
	
	@Autowired
	LicenceGisVODao licenceGisVODao;
	
	/**
	 * @queryLicenceExpireWarning：按时间检索到期许可证
	 * @param expireTime:检索的时间
	 * @return：List<ExpireLicenceGisVO>
	 */
	@Override
	public List<LicenceReturnDataGisVO> queryLicenceExpireWarning(String expireTime, String areacode){
		//作为统计许可证到期数量的查询结果
		List<ExpireLicenceGisVO> list = null;
		List<LicenceReturnDataGisVO> listData = new ArrayList<>();
		if (areacode.equals("isNull")) {	//地区编码为空
			//存在市级地区前四位地区编码
			List<AreaCodeGisVO> cityAreacode = licenceGisVODao.queryCityAreacode();
			for (int i = 0; i < cityAreacode.size(); i++) {
				String areaLevel = null;
				String s = cityAreacode.get(i).getCodeRegion();
					if (s.substring(2,4).equals("00")) {	//如果地区编码是省级的
						s = s.substring(0, 2);
						list = licenceGisVODao.queryLicenceExpireWarning(s);
						areaLevel = "province";
						listData.add(pastDueNumber(list, expireTime, s, cityAreacode.get(i), areaLevel));
					} else {	//地区编码不是省级的
						areaLevel = "city";
						list = licenceGisVODao.queryLicenceExpireWarning(s);
						listData.add(pastDueNumber(list, expireTime, s, cityAreacode.get(i), areaLevel));
					}
				}
			
		} else {
			String disposeAreacode = getDisposeAreacode(areacode);
			String areaLevel = "city";
			list = licenceGisVODao.queryLicenceExpireWarning(disposeAreacode);
			AreaCodeGisVO areaCodeGisVO = licenceGisVODao.queryByAreacode(areacode.substring(0,9));
			listData.add(pastDueNumber(list, expireTime, disposeAreacode, areaCodeGisVO, areaLevel));
		}
		return listData;
	}
	
	/**
	 * 
	 * dateCompare:TODO 日期比较
	 *
	 * @param endTime：许可证到期时间
	 * @param expireTime：前台传过来检索的日期
	 * @return long
	 */
	private static long dateCompare(Date endTime, Date expireTime) {
		long etime = endTime.getTime();
		long extime = expireTime.getTime();
		long differ = (etime - extime)/(24*60*60*1000);	//计算两个日期的差值得到天数
		return differ;
	}
	
	/**
	 * 
	 * getDisposeAreacode:TODO 处理过的地区编码
	 *
	 * @param areacode
	 * @return String
	 */
	private static String getDisposeAreacode(String areacode) {
		/**经过处理的地区编码*/
		String disposeAreacode = null;
		if (areacode != null && !areacode.isEmpty()) {
			if (areacode.substring(2, 6).equals("0000")) {
				/**
				 * 传进来的是省级地区代码
				 */
				disposeAreacode = areacode.substring(0, 2);
			} else if (!areacode.substring(2, 4).equals("00") && areacode.substring(4, 6).equals("00")) {
				/**
				 * 传进来的是市级地区代码
				 */
				disposeAreacode = areacode.substring(0, 4);
			} else if (!areacode.substring(2, 6).equals("0000")) {
				/**
				 * 传进来的是区级地区代码
				 */
				disposeAreacode = areacode.substring(0, 6);
			}
		} 
		return disposeAreacode;
	}

	private static LicenceReturnDataGisVO pastDueNumber(List<ExpireLicenceGisVO> list, String expireTime, 
			String disposeAreacode, AreaCodeGisVO areaCodeGisVO, String areaLevel){
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		long differValue;	//检索条件与许可证到期日期差值的天数
		long pastDueNum = 0;	//许可证已经过期数量
		long onePastDueNum = 0;	//还有一个月过期数量
		long twoPastDueNum = 0;	//还有过期两个月过期数量
		long threePastDueNum = 0;//还有过期三个月过期数量
		long sixPastDueNum = 0;	//还有过期六个月过期数量
		long gtSixPastDueNum = 0;//大于六个月过期数量
		ExpireLicenceGisVO expireLicenceGisVO;
		try {
			for (int i = 0; i < list.size(); i++) {
				expireLicenceGisVO = list.get(i);
				differValue = dateCompare(expireLicenceGisVO.getEtime(), format.parse(expireTime));
				if (differValue <= 0) {
					pastDueNum++;
					list.get(i).setWarningLevel("pastdue");
				} else if (differValue <= 30) {
					onePastDueNum++;
					list.get(i).setWarningLevel("onepastdue");
				} else if (differValue <= 60) {
					twoPastDueNum++;
					list.get(i).setWarningLevel("twopastdue");
				}else if (differValue <= 90) {
					threePastDueNum++;
					list.get(i).setWarningLevel("threepastdue");
				}else if (differValue <= 180) {
					sixPastDueNum++;
					list.get(i).setWarningLevel("sixpastdue");
				} else if (differValue > 180) {
					gtSixPastDueNum++;
					list.get(i).setWarningLevel("gtsixpastdue");
				}
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		LicenceReturnDataGisVO licenceReturnDataGisVO = new LicenceReturnDataGisVO();
		licenceReturnDataGisVO.setAreacode(areaCodeGisVO.getCodeRegion());
		licenceReturnDataGisVO.setRegionname(areaCodeGisVO.getRegionname());
		licenceReturnDataGisVO.setAreaLevel(areaLevel);
		licenceReturnDataGisVO.setLongitude(areaCodeGisVO.getLongitude());
		licenceReturnDataGisVO.setLatitude(areaCodeGisVO.getLatitude());
		licenceReturnDataGisVO.setPastDueNum(pastDueNum);
		licenceReturnDataGisVO.setOnePastDueNum(onePastDueNum);
		licenceReturnDataGisVO.setTwoPastDueNum(twoPastDueNum);
		licenceReturnDataGisVO.setThreePastDueNum(threePastDueNum);
		licenceReturnDataGisVO.setSixPastDueNum(sixPastDueNum);
		licenceReturnDataGisVO.setGtSixPastDueNum(gtSixPastDueNum);
		licenceReturnDataGisVO.setSublist(list);
		return licenceReturnDataGisVO;
	}
}
